package nl.moviefan.site.controller;

import java.security.Principal;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import nl.moviefan.site.model.Artikel;
import nl.moviefan.site.model.MoviefanUser;
import nl.moviefan.site.model.Recensie;
import nl.moviefan.site.service.ArtikelService;
import nl.moviefan.site.service.RecensieService;
import nl.moviefan.site.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

/**
 * Handler for mapping all /recensie uri.
 */
@Controller
@RequestMapping("/recensie")
public class RecensieController {

    @Autowired
    RecensieService recensieService;

    @Autowired
    UserService userservice;

    @Autowired
    ArtikelService artikelService;

    /**
     * Methode mapt /index uri en voegt alle recensies geschreven door ingelogde
     * gebruiker toe.
     *
     * @param principal
     * @return
     */
    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public ModelAndView getAlleRecensiesGebruiker(Principal principal) {
        String currentUserName = principal.getName();
        MoviefanUser mu = userservice.findByUsername(currentUserName);
        List<Recensie> recensies = recensieService.getAllRecensiesByUser(mu);

        ModelAndView mav = new ModelAndView("recensie/index");
        mav.addObject("recensies", recensies);
        return mav;
    }

    /**
     * Methode mapt /create/{artikelid} uri en voegt artikel met aangegeven 
     * artikelid toe.
     *
     * @param artikelid
     * @return
     */
    @RequestMapping(value = "/create/{artikelid}", method = RequestMethod.GET)
    public ModelAndView getRecensieForm(@PathVariable long artikelid) {
        ModelAndView modelandview = new ModelAndView("recensie/create");
        Artikel artikel = null;
        try {
            artikel = artikelService.findByArtikelID(artikelid);
        } catch (Exception ex) {
            Logger.getLogger(RecensieController.class.getName()).log(Level.SEVERE, null, ex);
        }
        modelandview.addObject("artikel", artikel);
        modelandview.addObject("recensie", new Recensie());
        return modelandview;
    }

    /**
     * Methode mapt /create/{artikelid} POST uri en haalt ingevoerde recensie 
     * op en slaat deze op in database.
     * @param recensie
     * @param artikelid
     * @param principal
     * @param bindingResult
     * @param model
     * @return 
     */
    @RequestMapping(value = "/create/{artikelid}", method = RequestMethod.POST)
    public String createRecensie(@ModelAttribute("recensie") Recensie recensie, @PathVariable long artikelid, Principal principal, BindingResult bindingResult, ModelAndView model) {
        Artikel artikel = null;
        String result = "recensie/fout";
        MoviefanUser moviefanuser = userservice.findByUsername(principal.getName());
        try {
            artikel = artikelService.findByArtikelID(artikelid);
        } catch (Exception ex) {
            Logger.getLogger(RecensieController.class.getName()).log(Level.SEVERE, null, ex);
        }
        recensie.setArtikel(artikel);
        recensie.setMoviefanUser(moviefanuser);
        Recensie rec = recensieService.saveRecensie(recensie);
        if (rec != null) {
            result = "redirect:/recensie/index";
        }
        return result;
    }

}
